//Linux系统---TCP/IP客户端测试代码

/*使用方法步骤：

1、在Linux虚拟中 执行gcc -o hello_tcp hello_tcp.c进行代码编译
2、打开TCP服务器、确保服务器主机和虚拟机能相互ping通
3、虚拟中执行命令：./hello_tcp hostaddr "Hello, TCP Server!"
@#  hostaddr：服务器主机IP地址


想要在ARM开发板上运行该程序，需要进行交叉编译
安装交叉编译工具链步骤：
sudo apt update
sudo apt install build-essential
sudo apt install gcc-arm-linux-gnueabihf

交叉编译：

arm-linux-gnueabihf-gcc -o hello_tcp hello_tcp.c

*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>

#define PORT 1884
#define BUFFER_SIZE 1024

int main(int argc,char *argv[])
{
    int sockfd,sendbytes,recvbytes;
    char send_buf[BUFFER_SIZE];
    char recv_buf[BUFFER_SIZE];
    struct hostent *host;
    struct sockaddr_in serv_addr;

    if(argc < 3)
    {
        fprintf(stderr,"USAGE:./client Hostname(or ip address) Text\n");
        exit(1);
    }

    /*地址解析函数*/

    if((host=gethostbyname(argv[1])) == NULL)
    {
        perror("gethostbuname");
        exit(1);

    }

    memset(send_buf,0,sizeof(send_buf));
    sprintf(send_buf,"%s",argv[2]);

    /*创建 socket*/

    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        perror("socket");
        exit(1);
    
    }

    /*设置sockaddr_in 结构体相关参数*/
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero),8);

    /*调用connect函数主动发起对服务器端的连接*/

    if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))== -1)
    {
        perror("connect");
        exit(1);
    }
	
    /*使用 send() 函数发送数据到已连接的套接字（sockfd）*/

    if((sendbytes = send(sockfd,send_buf,strlen(send_buf),0)) == -1)
    {
        perror("send");
        exit(1);

    }

    memset(recv_buf , 0, sizeof(recv_buf)); 
    /*调用 recv()函数接收服务器的请求*/

    if ((recvbytes = recv(sockfd, recv_buf, BUFFER_SIZE, 0)) == -1) 
    { 
        perror("recv"); 
        exit(1); 
    } 

    printf("Received a message: %s\n", recv_buf);

    close(sockfd);
    exit(0);
    
}

